local player = owner local character = player.Character local ballchar = Instance.new("Model", script) ballchar.Name = "ball" local ball = Instance.new("Part", ballchar) ball.Name = "Part" ball.CFrame = character.HumanoidRootPart.CFrame player.Character = ballchar ball.Size = Vector3.new(3, 3, 3) ball.Material = Enum.Material.Foil ball.Shape = Enum.PartType.Ball ball.BrickColor = BrickColor.Black() local physics1 = PhysicalProperties.new(999, 100, 0) -- default values are 0.7, 0.3, 0.5 local physics2 = PhysicalProperties.new(0.7, 0.5, 100) ball.CustomPhysicalProperties = physics1 local face = Instance.new("Decal", ball) face.Texture = "rbxassetid://10184799258" local spikemesh = Instance.new("SpecialMesh") spikemesh.MeshId = "rbxassetid://9982590" spikemesh.Scale = Vector3.new(1.75, 1.75, 1.75) local stabsound = Instance.new("Sound", ball) stabsound.SoundId = "rbxassetid://2621754201" stabsound.Volume = 1 local stickmesh = Instance.new("SpecialMesh") stickmesh.MeshId = "rbxassetid://24388358" stickmesh.Scale = Vector3.new(2, 2, 2) local sticksound = Instance.new("Sound", ball) sticksound.SoundId = "rbxasset://sounds/splat.wav" sticksound.Volume = 1 local spikeevent = Instance.new("RemoteEvent", ballchar) spikeevent.Name = "SpikeEvent" local stickevent = Instance.new("RemoteEvent", ballchar) stickevent.Name = "StickEvent" local spiky = false local sticky = false local stuck = {} spikeevent.OnServerEvent:Connect(function() if sticky == false then if spiky == false then spiky = true ball.CustomPhysicalProperties = physics2 stabsound:Play() ball.Size = Vector3.new(6, 6, 6) spikemesh.Parent = ball ball.Reflectance = 0.2 elseif spiky == true then spikemesh.Parent = nil ball.CustomPhysicalProperties = physics1 ball.Size = Vector3.new(3, 3, 3) ball.Reflectance = 0 spiky = false end end end) stickevent.OnServerEvent:Connect(function() if spiky == false then if sticky == false then sticky = true sticksound:Play() ball.Size = Vector3.new(2, 2, 2) stickmesh.Parent = ball elseif sticky == true then sticky = false ball:BreakJoints() ball.Size = Vector3.new(3, 3, 3) stickmesh.Parent = nil stuck = {} end end end) ball.Touched:Connect(function(otherpart) if spiky == true then local humanoid = otherpart.Parent:FindFirstChildWhichIsA("Humanoid") if humanoid then humanoid:TakeDamage(10) humanoid.PlatformStand = true task.wait(0.5) humanoid.PlatformStand = false end end if sticky == true then if otherpart.Anchored == false and otherpart.CanCollide == true then local weld = Instance.new("WeldConstraint", ball) weld.Part0 = ball weld.Part1 = otherpart end end end) NLS([[ local UserInputService = game:GetService("UserInputService") local player = game.Players.LocalPlayer local ball = player.Character.Part local camera = workspace.CurrentCamera camera.CameraSubject = ball local spikeevent = script.Parent:FindFirstChild("SpikeEvent") local stickevent = script.Parent:FindFirstChild("StickEvent") local Wdown = false local Adown = false local Sdown = false local Ddown = false local looking = false local gyro = Instance.new("BodyGyro", ball) gyro.MaxTorque = Vector3.new(0, 0, 0) UserInputService.InputBegan:Connect(function(Input) if UserInputService:GetFocusedTextBox() == nil then if Input.KeyCode == Enum.KeyCode.W then Wdown = true end if Input.KeyCode == Enum.KeyCode.A then Adown = true end if Input.KeyCode == Enum.KeyCode.S then Sdown = true end if Input.KeyCode == Enum.KeyCode.D then Ddown = true end if Input.KeyCode == Enum.KeyCode.Space then ball.Velocity = ball.Velocity + Vector3.new(0, 50, 0) end if Input.KeyCode == Enum.KeyCode.F then spikeevent:FireServer() end if Input.KeyCode == Enum.KeyCode.E then ball.Velocity = ball.Velocity * 5 end if Input.KeyCode == Enum.KeyCode.Q then if looking == false then looking = true gyro.MaxTorque = Vector3.new(math.huge, math.huge, math.huge) elseif looking == true then looking = false gyro.MaxTorque = Vector3.new(0, 0, 0) end end if Input.KeyCode == Enum.KeyCode.Z then stickevent:FireServer() end end end) UserInputService.InputEnded:Connect(function(Input) if Input.KeyCode == Enum.KeyCode.W then Wdown = false end if Input.KeyCode == Enum.KeyCode.A then Adown = false end if Input.KeyCode == Enum.KeyCode.S then Sdown = false end if Input.KeyCode == Enum.KeyCode.D then Ddown = false end end) while true do if Wdown == true then ball.Velocity = ball.Velocity + camera.CFrame.LookVector end if Adown == true then local targetcframe = camera.CFrame * CFrame.Angles(0, math.rad(90), 0) ball.Velocity = ball.Velocity + targetcframe.LookVector end if Sdown == true then ball.Velocity = ball.Velocity + camera.CFrame.LookVector * -1 end if Ddown == true then local targetcframe = camera.CFrame * CFrame.Angles(0, math.rad(-90), 0) ball.Velocity = ball.Velocity + targetcframe.LookVector end gyro.CFrame = CFrame.lookAt(ball.Position, player:GetMouse().Hit.Position) task.wait() end ]], player.Character) while true do if ball.Position.Y < -100 then ball.Velocity = Vector3.zero ball:BreakJoints() ball.Position = Vector3.new(0, 50, 0) end task.wait() end